﻿namespace GoFun.Tests

open NUnit.Framework
open FsCheck
open GoFun.Lib

[<TestFixture>]
type ``Teste das Auffinden von Ketten``() = 

    [<Test>]
    member test.``Kette eines einzelnen Steins enthält nur dessen Position``() =
        let {Brett = brett; Gesetzt = _} =
            [ 
              ['_'; '_'; '_'];
              ['_'; 'b'; '_'];
              ['_'; '_'; '_'];
            ] |> parseBrett

        let kette = Ketten.ketteVon brett (1,1)
        let expected = [ (1,1) ] |> Set.ofList
        Assert.AreEqual(expected, kette)
    
    [<Test>]
    member test.``Kette zweier nicht zusammenhängende Steine enthält nur angefragte Position``() =
        let {Brett = brett; Gesetzt = _} =
            [ 
              ['_'; '_'; '_'];
              ['b'; '_'; 'b'];
              ['_'; '_'; '_'];
            ] |> parseBrett

        let kette = Ketten.ketteVon brett (1,0)
        let expected = [ (1,0) ] |> Set.ofList
        Assert.AreEqual(expected, kette)
    
    [<Test>]
    member test.``zwei Stein zusammenhängende vom Rand``() =
        let {Brett = brett; Gesetzt = _} =
            [ 
              ['_'; '_'; '_'];
              ['b'; 'b'; '_'];
              ['_'; '_'; '_'];
            ] |> parseBrett

        let kette = Ketten.ketteVon brett (1,0)
        let expected = [ (1,0); (1,1) ] |> Set.ofList
        Assert.AreEqual(expected, kette)

    [<Test>]
    member test.``erkennt erzeugte Kette mit FsCheck``() =
        Arb.register<CustomGenerators>() |> ignore
        let ketteWirdErkannt (kette : Kette) =
            let brett =
                kette |>
                Seq.fold 
                    (BrettOperations.setzePosition PositionStatus.Black) 
                    emptyBoard
            if Seq.isEmpty kette then true else
            let posInKette = kette |> Set.toSeq |> Seq.head
            let erkannt = Ketten.ketteVon brett posInKette
            kette = erkannt
        Check.QuickThrowOnFailure ketteWirdErkannt
       